package island.gotenyama.wand.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.springframework.util.Assert;

/**
 * メッセージキーを表すクラス<br>
 *
 * @author tk
 */
public class MessageKey implements Serializable {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * メッセージキーが指定されていない。
	 */
	public static final String ERROR_MSG = "メッセージキーが指定されていない。";

	/**
	 * キー値
	 */
	private final String key;

	/**
	 * 対象となるフィールド名称
	 */
	private final String fieldName;

	/**
	 * キー値に対応したプレースホルダー(null可,変更不可)
	 */
	private final List<String> placeFolderList;

	/**
	 * コンストラクタ
	 *
	 * @param key キー値
	 */
	public MessageKey(final String key) {
		Assert.notNull(key, ERROR_MSG);
		this.key = key;
		this.fieldName = null;
		this.placeFolderList = null;
	}

	/**
	 * コンストラクタ
	 *
	 * @param key キー値
	 * @param srcFieldName 対象となるフィールド名称
	 * @param srcHolderList プレースホルダーリスト
	 */
	public MessageKey(final String key, final String srcFieldName, final List<String> srcHolderList) {
		Assert.notNull(key, ERROR_MSG);
		this.key = key;
		this.fieldName = srcFieldName;
		if (srcHolderList != null) {
			this.placeFolderList = Collections.unmodifiableList(srcHolderList);
		} else {
			this.placeFolderList = null;
		}
	}

	/**
	 * コンストラクタ
	 *
	 * @param key キー値
	 * @param srcFieldName 対象となるフィールド名称
	 * @param srcHolderArray プレースホルダー配列
	 */
	public MessageKey(final String key, final String srcFieldName, final String... srcHolderArray) {
		Assert.notNull(key, ERROR_MSG);
		this.key = key;
		this.fieldName = srcFieldName;
		if (srcHolderArray != null && srcHolderArray.length > 0) {
			List<String> holderList = new ArrayList<String>(srcHolderArray.length);
			for (String params : srcHolderArray) {
				holderList.add(params);
			}
			this.placeFolderList = Collections.unmodifiableList(holderList);
		} else {
			this.placeFolderList = null;
		}
	}

	/**
	 * キー値を取得する。
	 *
	 * @return the key
	 */
	public String getKey() {
		return key;
	}

	/**
	 * プレースホルダーを取得する。
	 *
	 * @return プレースホルダー
	 */
	public List<String> getPlaceFolderList() {
		return placeFolderList;
	}

	/**
	 * フィールド名称を取得する。
	 *
	 * @return フィールド名称
	 */
	public String getFieldName() {
		return fieldName;
	}
}
